package com.lh.jianzhioffer.专项练习.位运算;

/**
 * @author: linghao
 * @since: 2023/2/17
 *
 * 给定一个字符串数组 words，请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时，
 * 它们长度的乘积的最大值。假设字符串中只包含英语的小写字母。如果没有不包含相同字符的一对字符串，返回 0
 *
 */
public class 单词长度的最大乘积005 {

    //位运算
    //masks[i] |= 1 << (word[j] - 'a'); word[j] - 'a' 表示的是字母在字母表中的顺序(从0开始）
    // 1 << (word[j] - 'a')意思就是 a就是第0位是1，b就是第2位是1， 在与mask[i]执行与操作就可以得到掩码了
    public int maxProduct(String[] words) {
        int[] f = new int[words.length];
        for(int i=0;i<f.length;i++){
            for(char c : words[i].toCharArray()){
                    f[i] = f[i] | (1<<(c-'a'));  //1左移的位数和0取逻辑或的结果，保存对应字母位为0时对应字母不存在，1则存在
            }
        }

        int max = 0;
        for(int i=0;i<f.length;i++){
            for(int j=i+1;j<f.length;j++){
                if((f[i] & f[j]) == 0){
                    max = Math.max(max,words[i].length() * words[j].length());
                }
            }
        }
        return max;
    }
}
